package com.hxk.juc.thread;

import java.util.concurrent.TimeUnit;

/**
 * ThreadLocal
 *  ThreadLocal是线程内部的一个存储类，可以在指定的线程内存储数据，只有指定的线程才能获取存储数据
 *  ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题，不同的点是
        Synchronized是通过线程等待，牺牲时间来解决访问冲突
        ThreadLocal是通过每个线程单独一份存储空间，牺牲空间来解决冲突，并且相比于Synchronized，ThreadLocal具有线程隔离的效果，只有在线程内才能获取到对应的值，线程外则不能访问到想要的值。
        正因为ThreadLocal的线程隔离特性，使他的应用场景相对来说更为特殊一些。
 */
public class ThreadLocalCase {

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread t1 = new Thread(myRunnable,"T1");
        Thread t2 = new Thread(myRunnable, "T2");
        t1.start();
        t2.start();
    }

}

class MyRunnable implements Runnable{

    ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

    @Override
    public void run() {
        //向threadLocal中放入值
        threadLocal.set((int)(Math.random() * 100D));
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //获取threadLocal中放入的值
        System.out.println(Thread.currentThread().getName()+"\t 值"+threadLocal.get());
    }
}
